package com.polymorphic多态.Dinamic动态;

/**
 * Java的动态绑定机制（非常非常重要）  韩顺平314集
 * 1.当调用对象方法的时候，该方法会和该对象的运行类型绑定；（简单理解为  所有方法都从 运行类型 开始 ，在父类中调用的方法也得先从运行类型开始查找）
 * 2.当调用对象属性的时候，没有动态绑定机制，哪里声明就用哪里的；（最近查找属性）
 */

public class DynamicBinding {
    public static void main(String[] args) {
        A a = new B();  // 向上转型
        System.out.println(a.sum());
        /**
         * 方法看运行类型，所以从子类开始
         * 子类没有sum（）方法，去找父类的sum（）方法，找到了
         *   public int sum() {
         *         return getI() + 10;
         *     }
         * 当返回时发现有getI（）方法，这里就用到了动态绑定机制，方法和运行类型绑定
         * 因为运行类型B中有getI（）方法，所以就找B中的getI（）方法，
         * public int getI() {
         *         return i;
         *     }
         *  因为这个i在B中，所以就找B中的i=20，返回到return getI() + 10，
         *  return 20+10;
         *  所以输出30；
         */
        System.out.println(a.sum1());
        /**
         * 1.先从子类开始，没有sum（）方法，就去父类找，找到了
         * 2.public int sum1() {
         *         return i + 10;
         *     }
         *     因为这个i在父类中，所以就找父类中的i=10，返回到return i + 10，
         *     return 10+10;
         *     所以输出20；
         */
    }
}

class A {
    public int i = 10;

    public int sum() {
        return getI() + 10;
    }

    public int getI() {
        return i;
    }

    public int sum1() {
        return i + 10;
    }
}


class B extends A {
    public int i = 20;

//    public int sum() {
//        return getI() + 20;
//    }

    public int getI() {
        return i;
    }

//    public int sum1() {
//        return i + 10;
//    }
}